const CHUNK_SIZE = 1024 * 1024 * 10; // 10M的分片大小
const THREAD_COUNT = navigator.hardwareConcurrency || 4; // 电脑的内核数，我这个是6核的

export function cutFile(file) {
  return new Promise(resolve => {
    const chunkCount = Math.ceil(file.size / CHUNK_SIZE); // 分片数量，向上取整
    console.log('总分片数量=>', chunkCount);
    const result = [];
    let finishCount = 0;
    const threadChunkCount = Math.ceil(chunkCount / THREAD_COUNT); // 每个线程的分片数量
    console.log('每个线程的分片数量=>', threadChunkCount);
    for (let i = 0; i < THREAD_COUNT; i++) {
      // 一般有几个内核就开几个线程
      // 创建一个web worker线程，并分配任务
      // { type: 'module' }告诉线程，这是一个模块线程
      // Webpack中，import.meta.url 是ES Modules提供的一个特性，它返回当前模块的URL。使用 new URL('./worker.js', import.meta.url) 可以确保无论模块被打包到哪里，都能正确地解析出Worker脚本的路径
      let worker = new Worker(new URL('./worker.js', import.meta.url), { type: 'module' });
      let start = i * threadChunkCount;
      let end = (i + 1) * threadChunkCount;
      // console.log([start + 1, end]);
      if (end > chunkCount) {
        end = chunkCount; // end不能超过最大分片数量
      }
      // 发送消息到子线程
      worker.postMessage({
        file,
        CHUNK_SIZE,
        startChunkIndex: start,
        endChunkIndex: end
      });
      // 接收子线程的消息
      worker.onmessage = e => {
        for (let j = start; j < end; j++) {
          result[j] = e.data[j - start]; // 不用push，而是直接序号赋值，是为了保证分片的顺序
        }
        worker.terminate(); // 接收到子线程消息后，关闭这个worker
        finishCount++;
        // 全部线程完成，就推到外部
        if (finishCount === THREAD_COUNT) {
          resolve(result);
        }
      };
    }
  });
}
